package com.fotile.weixin.work.utils;

import com.alibaba.fastjson.JSONObject;


import com.fotile.base.FastJsonUtil;
import com.fotile.base.StringUtil;
import com.fotile.base.net.HttpUtil;
import com.fotile.weixin.work.param.Dept;
import com.fotile.weixin.work.param.Tag;
import com.fotile.weixin.work.request.contactParam.SyncReplacePartyRequest;
import com.fotile.weixin.work.request.contactParam.User;
import com.fotile.weixin.work.request.token.Callback;

import com.fotile.weixin.work.response.WeiXinResult;
import com.fotile.weixin.work.response.contactResult.DeptListResult;
import com.fotile.weixin.work.response.contactResult.DeptResult;
import com.fotile.weixin.work.response.contactResult.OpenIdResult;
import com.fotile.weixin.work.response.contactResult.SyncUserJobResult;
import com.fotile.weixin.work.response.contactResult.SyncUserResult;
import com.fotile.weixin.work.response.contactResult.TagListResult;
import com.fotile.weixin.work.response.contactResult.TagResult;
import com.fotile.weixin.work.response.contactResult.TagUserResult;
import com.fotile.weixin.work.response.contactResult.UserListResult;
import com.fotile.weixin.work.response.contactResult.UserResult;
import com.fotile.weixin.work.response.token.AccessToken;

/**
 * 企业微信通讯录相关接口
 * 包括部门，人员和标签的管理
 *
 * @author 江虹
 * @version 1.0, 18/09/03
 */
public class WorkContactUtil {

    /**
     * Field description
     */
    private static final String QY_WEIXIN_PREFIX = "https://qyapi.weixin.qq.com/cgi-bin/";

    /**
     * 成员管理-二次验证
     * 此接口可以满足安全性要求高的企业进行成员加入验证。开启二次验证后，用户加入企业时需要跳转企业自定义的页面进行验证。
     * 企业在开启二次验证时，必须在管理端填写企业二次验证页面的url。 当成员登录企业微信或关注微工作台（原企业号）加入企业时，
     * 会自动跳转到企业的验证页面。在跳转到企业的验证页面时，会带上如下参数：code=CODE。
     * 企业收到code后，使用“通讯录同步助手”调用“根据code获取成员信息”接口获取成员的userid。然后在验证成员信息成功后，调用如下接口即可让成员成功加入企业。
     *
     * @param token
     * @param userId
     * @return
     */
    public static WeiXinResult authsucc(String token, int userId) {
        String url = QY_WEIXIN_PREFIX + "user/authsucc?access_token=" + token + "&userId" + userId;
        String result = HttpUtil.get(url);

        return FastJsonUtil.parseToClass(result, UserListResult.class);
    }

    /**
     * 成员管理- 批量删除人员
     *
     * @param token   调用接口凭证
     * @param userIds 成员UserID列表。对应管理端的帐号。最多支持200个。若存在无效UserID，直接返回错误
     * @return
     */
    public static UserResult batchDelUser(String token, String[] userIds) {
        String url = QY_WEIXIN_PREFIX + "user/batchdelete?access_token=" + token;
        String data = "{\"useridlist\": " + JSONObject.toJSONString(userIds) + "}";

        System.out.println(data);

        String result = HttpUtil.postJson(url, data);

        return FastJsonUtil.parseToClass(result, UserResult.class);
    }

    /**
     * 批量替换用户
     *全量覆盖成员 接口说明： 本接口以userid为主键，全量覆盖企业的通讯录成员，任务完成后企业的通讯录成员与提交的文件完全保持一致。请先下载CSV文件(下载全量覆盖成员模版)，根据需求填写文件内容。
     * @param token
     * @param mediaId
     * @return
     */
    public static SyncUserResult batchReplaceUser(String token, String mediaId) {
        String url = QY_WEIXIN_PREFIX + "batch/replaceuser?access_token=" + token;
        String data = "{\"media_id\":\"" + mediaId + "\"}";
        String result = HttpUtil.postJson(url, data);

        return FastJsonUtil.parseToClass(result, SyncUserResult.class);
    }

    /**
     * 批量更新
     * 本接口以userid（帐号）为主键，增量更新企业微信通讯录成员。请先下载CSV模板(下载增量更新成员模版)，根据需求填写文件内容。
     * @param token
     * @param mediaId
     * @return
     */
    public static SyncUserResult batchUpdateUser(String token, String mediaId) {
        String url = QY_WEIXIN_PREFIX + "batch/syncuser?access_token=" + token;
        String data = "{\"media_id\":\"" + mediaId + "\"}";
        String result = HttpUtil.postJson(url, data);

        return FastJsonUtil.parseToClass(result, SyncUserResult.class);
    }

    /**
     * 成员管理-userid转openid
     * 该接口使用场景为企业支付，在使用企业红包和向员工付款时，需要自行将企业微信的userid转成openid。
     * 成员必须处于应用的可见范围内
     *
     * @param token  调用接口凭证
     * @param userId 企业内的成员id
     * @return
     */
    public static OpenIdResult convert_to_openid(String token, String userId) {
        String url = QY_WEIXIN_PREFIX + "user/convert_to_openid?access_token=" + token;
        String result = HttpUtil.postJson(url, FastJsonUtil.parseToJSON(userId));

        return FastJsonUtil.parseToClass(result, OpenIdResult.class);
    }

    /**
     * 成员管理-openid转userid
     * 该接口主要应用于使用企业支付之后的结果查询。 开发者需要知道某个结果事件的openid对应企业微信内成员的信息时，可以通过调用该接口进行转换查询。
     * 管理组需对openid对应的企业微信成员有查看权限。
     *
     * @param token  调用接口凭证
     * @param openId 企业内的成员id
     * @return
     */
    public static AccessToken convert_to_userid(String token, String openId) {
        String url = QY_WEIXIN_PREFIX + "user/convert_to_userid?access_token=" + token;
        String result = HttpUtil.postJson(url, FastJsonUtil.parseToJSON(openId));

        return FastJsonUtil.parseToClass(result, AccessToken.class);
    }

    /**
     * 部门管理-创建部门
     *
     * @param token token凭据
     * @param dept  部门实体类，name(部门名称)和parentid(父部门Id，根部门为1)必填，id和order选填，order越小越靠前
     * @return
     */
    public static DeptResult createDept(String token, Dept dept) {
        String url = QY_WEIXIN_PREFIX + "department/create?access_token=" + token;
        String result = HttpUtil.postJson(url, FastJsonUtil.parseToJSON(dept));

        return FastJsonUtil.parseToClass(result, DeptResult.class);
    }

    /**
     * 成员管理-创建用户
     * 扩展属性需要在WEB管理端创建后才生效，否则忽略未知属性的赋值
     *
     * @param token
     * @param user
     * @return
     */
    public static UserResult createUser(String token, User user) {
        String url = QY_WEIXIN_PREFIX + "user/create?access_token=" + token;
        String result = HttpUtil.postJson(url, FastJsonUtil.parseToJSON(user));

        return FastJsonUtil.parseToClass(result, UserResult.class);
    }

    /**
     * 部门管理- 删除部门
     * @param token token凭据
     * @param id    待删除部门id
     * @return
     * @Title: delDept
     * @Description:删除部门
     */
    public static DeptResult delDept(String token, int id) {
        String url = QY_WEIXIN_PREFIX + "department/delete?access_token=" + token + "&id=" + id;
        String result = HttpUtil.get(url);

        return FastJsonUtil.parseToClass(result, DeptResult.class);
    }

    /**
     * 成员管理-删除人员
     *
     * @param token  调用接口凭证
     * @param userId 成员UserID。对应管理端的帐号
     * @return
     */
    public static UserResult delUser(String token, String userId) {
        String url = QY_WEIXIN_PREFIX + "user/delete?access_token=" + token + "&userid=" + userId;
        String result = HttpUtil.get(url);

        return FastJsonUtil.parseToClass(result, UserResult.class);
    }

    /**
     * 异步接口：全量覆盖部门
     * 接口说明： 本接口以partyid为键，全量覆盖企业的通讯录组织架构，任务完成后企业的通讯录组织架构与提交的文件完全保持一致。请先下载CSV文件(下载全量覆盖部门模版)，根据需求填写文件内容。
     *
     * @param token
     * @param mediaId
     * @param callbackUrl
     * @param signToken
     * @param aeskey
     * @return
     */
    public static SyncUserResult replaceDepartment(String token, String mediaId, String callbackUrl, String signToken,
                                                   String aeskey) {
        String url = QY_WEIXIN_PREFIX + "batch/replaceparty?access_token=" + token;

        System.out.println(url);

        SyncReplacePartyRequest request = new SyncReplacePartyRequest();

        request.setMediaId(mediaId);

        if (StringUtil.isNotBlank(callbackUrl)) {
            Callback callback = new Callback(callbackUrl, signToken, aeskey);

            request.setCallback(callback);
        }

        System.out.println("request data: \n" + FastJsonUtil.parseToJSON(request));

        String result = HttpUtil.postJson(url, FastJsonUtil.parseToJSON(request));

        return FastJsonUtil.parseToClass(result, SyncUserResult.class);
    }

    /**
     * 更新部门
     *
     * @param token token凭据
     * @param dept  部门实体类，id必填，name(部门名称)和parentid(父部门Id，根部门为1)和order选填，order越小越靠前
     * @return
     */
    public static DeptResult updateDept(String token, Dept dept) {
        String url = QY_WEIXIN_PREFIX + "department/update?access_token=" + token;
        String result = HttpUtil.postJson(url, FastJsonUtil.parseToJSON(dept));

        return FastJsonUtil.parseToClass(result, DeptResult.class);
    }

    /**
     * 更新人员
     *
     * @param token
     * @param user
     * @return
     */
    public static UserResult updateUser(String token, User user) {
        String url = QY_WEIXIN_PREFIX + "user/update?access_token=" + token;
        String result = HttpUtil.postJson(url, FastJsonUtil.parseToJSON(user));

        return FastJsonUtil.parseToClass(result, UserResult.class);
    }

    /**
     * 只能查询已经提交过的历史任务。
     * 只能查询已经提交过的历史任务。
     * @param token 调用接口凭证
     * @param taskid 异步任务id，最大长度为64字节
     * @return
     * @Title: getAsyncTaskResult
     * @Description:获取异步任务结果
     */
    public static SyncUserJobResult getAsyncTaskResult(String token, String taskid) {
        String url = QY_WEIXIN_PREFIX + "batch/getresult?access_token=" + token + "&jobid=" + taskid;
        String result = HttpUtil.get(url);

        return FastJsonUtil.parseToClass(result, SyncUserJobResult.class);
    }

    /**
     * 部门管理-获取部门列表
     *
     * @param token token凭据
     * @param id    部门id。获取指定部门及其下的子部门
     * @return
     */
    public static DeptListResult getDeptList(String token, int id) {
        String url = QY_WEIXIN_PREFIX + "department/list?access_token=" + token + "&id=" + id;
        String result = HttpUtil.get(url);

        return FastJsonUtil.parseToClass(result, DeptListResult.class);
    }

    /**
     * 成员管理- 获取成员信息
     *
     * @param token
     * @param userId
     * @return
     */
    public static UserResult getUser(String token, String userId) {
        String url = QY_WEIXIN_PREFIX + "user/get?access_token=" + token + "&userid=" + userId;
        String result = HttpUtil.get(url);

        System.out.println(result);

        return FastJsonUtil.parseToClass(result, UserResult.class);
    }

    /**
     * 获取部门下成员列表
     *
     * @param token      调用接口凭证
     * @param deptId     获取的部门id
     * @param fetchChild 1/0：是否递归获取子部门下面的成员
     * @return
     */
    public static UserListResult getUserList(String token, int deptId, int fetchChild) {
        String url = QY_WEIXIN_PREFIX + "user/list?access_token=" + token + "&department_id=" + deptId
                + "&fetch_child=" + fetchChild;
        String result = HttpUtil.get(url);

        return FastJsonUtil.parseToClass(result, UserListResult.class);
    }

    /**
     * 成员管理-获取部门成员
     * userlist 成员列表
     * userid   成员UserID。对应管理端的帐号
     * name     成员名称
     * department       成员所属部门
     *
     * @param token      调用接口凭证
     * @param deptId     获取的部门id
     * @param fetchChild 1/0：是否递归获取子部门下面的成员
     * @return
     */
    public static UserListResult getUserSimplelist(String token, int deptId, int fetchChild) {
        String url = QY_WEIXIN_PREFIX + "user/simplelist?access_token=" + token + "&department_id=" + deptId
                + "&fetch_child=" + fetchChild;
        String result = HttpUtil.get(url);

        return FastJsonUtil.parseToClass(result, UserListResult.class);
    }

    /**
     * 标签管理-创建标签
     * 注意，标签总数不能超过3000个。
     * @param token 调用接口凭证
     * @param tag
     * @return
     */
    public static TagResult createTag(String token, Tag tag) {
        String url = QY_WEIXIN_PREFIX + "tag/create?access_token=" + token ;
        String result = HttpUtil.postJson(url, FastJsonUtil.parseToJSON(tag));

        return FastJsonUtil.parseToClass(result, TagResult.class);
    }

    /**
     * 标签管理-更新标签名字
     * @param token 调用接口凭证
     * @param tag 标签类
     * @return
     */
    public static TagResult TagResult(String token, Tag tag) {
        String url = QY_WEIXIN_PREFIX + "tag/update?access_token=" + token ;
        String result = HttpUtil.postJson(url, FastJsonUtil.parseToJSON(tag));

        return FastJsonUtil.parseToClass(result, TagResult.class);
    }

    /**
     * 标签管理-获取标签成员
     * @param token
     * @param tagId
     * @return
     */
    public static TagUserResult getTagUsers(String token, int tagId) {
        String url = QY_WEIXIN_PREFIX + "tag/get?access_token=" + token +"&tagid=" + tagId;
        String result = HttpUtil.get(url);

        return FastJsonUtil.parseToClass(result, TagUserResult.class);
    }
    /**
     * 标签管理-获取标签成员
     * @param token
     * @return
     */
    public static TagUserResult addTagUsers(String token,int tagId, String[] userList,int[]partyList) {
        String url = QY_WEIXIN_PREFIX + "tag/addtagusers?access_token=" + token;
        String data = "{\"tagid\":"+ tagId + "\"userlist\":"+FastJsonUtil.parseToJSON(userList)+ "\"partylist\":"+FastJsonUtil.parseToJSON(partyList)+"}";
        String result = HttpUtil.postJson(url, data);

        return FastJsonUtil.parseToClass(result, TagUserResult.class);
    }

    /**
     * 标签管理-删除标签成员
     * 调用者必须是指定标签的创建者；成员属于应用的可见范围。
     * @param token 调用接口凭证
     * @param tagId 标签id
     * @param userList 非法的成员帐号列表
     * @param partyList 非法的部门id列表
     * @return
     */
    public static TagUserResult delTagUsers(String token,int tagId, String[] userList,int[]partyList) {
        String url = QY_WEIXIN_PREFIX + "tag/deltagusers?access_token=" + token;
        String data = "{\"tagid\":"+ tagId + "\"userlist\":"+FastJsonUtil.parseToJSON(userList)+ "\"partylist\":"+FastJsonUtil.parseToJSON(partyList)+"}";
        String result = HttpUtil.postJson(url, data);

        return FastJsonUtil.parseToClass(result, TagUserResult.class);
    }

    /**
     * 标签管理-获取标签列表
     * @param token 获取标签列表
     * @return
     */
    public static TagListResult getTags(String token) {
        String url = QY_WEIXIN_PREFIX + "tag/list?access_token=" + token;
        String result = HttpUtil.get(url);
        return FastJsonUtil.parseToClass(result, TagListResult.class);
    }

    /**
     * 邀请成员 企业可通过接口批量邀请成员使用企业微信，邀请后将通过短信或邮件下发通知。
     * @param token	调用接口凭证
     * @param tagList 标签ID列表，最多支持100个。
     * @param userList 成员ID列表, 最多支持1000个。
     * @param partyList 部门ID列表，最多支持100个。
     * @return
     */
    public static TagUserResult delTagUsers(String token, int[]tagList, String[] userList,int[]partyList) {
        String url = QY_WEIXIN_PREFIX + "batch/invite?access_token=" + token;
        String data = "{\"tag\":"+ FastJsonUtil.parseToJSON(tagList) + "\"user\":"+FastJsonUtil.parseToJSON(userList)+ "\"party\":"+FastJsonUtil.parseToJSON(partyList)+"}";
        String result = HttpUtil.postJson(url, data);

        return FastJsonUtil.parseToClass(result, TagUserResult.class);
    }


}


